/**
 * @func 手写apply
 * @param {function} context  // 需要绑定的this
 * @param {Array} args 
 * @returns 
 */
const myApply = function(context,args) {
    // 不传this默认指向window
    context = context || window;
    args = args ? args : [];
    // 给context新增一个独一无二的属性以免覆盖原有属性
    const key = Symbol();
    // this 指向调用它的对象
    context[key]=this;
    // 通过隐式绑定的方式调用函数
    const result = context[key](...args);
    // 删除添加的属性
    delete context[key];
    return result
}

// 测试
const obj1 = {
    name: 'joy',
    getName() {
        console.log(this.name); 
    }
};

const obj2 = {
    name: 'sam'
};

obj1.getName.myApply(obj2);  //sam